Fixes so xen+xenlinux boots on ski
authordjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Mon, 11 Jul 2005 15:20:39 +0000 (08:20 -0700)
committerdjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Mon, 11 Jul 2005 15:20:39 +0000 (08:20 -0700)
xen/arch/ia64/hyperprivop.S
xen/arch/ia64/vhpt.c

index 98a4b439bfee0f9ef9b442d17225a2caff518f4d..581044b1355724f0124bb8887d700fec204dedf9 100644 (file)
@@ -288,9 +288,10 @@ GLOBAL_ENTRY(fast_tick_reflect)
        cmp.ne p6,p0=r28,r30
 (p6)   br.cond.spnt.few rp;;
        movl r20=(PERCPU_ADDR)+IA64_CPUINFO_ITM_NEXT_OFFSET;;
-       ld8 r21=[r20];;
+       ld8 r26=[r20];;
        mov r27=ar.itc;;
-       cmp.ltu p6,p0=r21,r27
+       adds r27=200,r27        // safety margin
+       cmp.ltu p6,p0=r26,r27
 (p6)   br.cond.spnt.few rp;;
        mov r17=cr.ipsr;;
        // slow path if: ipsr.be==1, ipsr.pp==1
@@ -300,14 +301,16 @@ GLOBAL_ENTRY(fast_tick_reflect)
        extr.u r21=r17,IA64_PSR_PP_BIT,1 ;;
        cmp.ne p6,p0=r21,r0
 (p6)   br.cond.spnt.few rp;;
+       // definitely have a domain tick
+       mov cr.eoi=r0;;
+       mov rp=r29;;
+       mov cr.itm=r26;;        // ensure next tick
 #ifdef FAST_REFLECT_CNT
        movl r20=fast_reflect_count+((0x3000>>8)*8);;
        ld8 r21=[r20];;
        adds r21=1,r21;;
        st8 [r20]=r21;;
 #endif
-       mov cr.eoi=r0;;
-       mov rp=r29;;
        // vcpu_pend_timer(current)
        movl r18=XSI_PSR_IC;;
        adds r20=XSI_ITV_OFS-XSI_PSR_IC_OFS,r18 ;;
index 86495a8fe857e1b89bf4d9008f7cfee91fcda33b..0eca1abdf33c130e6c988d7fde72b00ecc77201b 100644 (file)
@@ -90,9 +90,10 @@ void vhpt_map(void)
 void vhpt_multiple_insert(unsigned long vaddr, unsigned long pte, unsigned long logps)
 {
        unsigned long mask = (1L << logps) - 1;
+       extern long running_on_sim;
        int i;
 
-       if (logps-PAGE_SHIFT > 10) {
+       if (logps-PAGE_SHIFT > 10 && !running_on_sim) {
                // if this happens, we may want to revisit this algorithm
                printf("vhpt_multiple_insert:logps-PAGE_SHIFT>10,spinning..\n");
                while(1);